package com.rabbit.handler;

import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.listener.api.RabbitListenerErrorHandler;
import org.springframework.amqp.rabbit.support.ListenerExecutionFailedException;

/**
 * 统一异常处理器，用于处理 RabbitMQ 消息消费失败后的异常情况。
 * 当消息消费失败时，此处理器会被调用，可以在这里记录异常信息、发送警报通知或进行其他自定义处理。
 * 适用于消费端的异常处理。处理{@link RabbitListener}注解中的异常
 *
 * @author yuhuan
 * @date 2025/4/21
 */
public class UnifiedExceptionHandler implements RabbitListenerErrorHandler {

    /**
     * 处理消息消费失败后的异常。可以在这里记录异常信息、发送警报通知或进行其他自定义处理。
     *
     * @param message  消费失败的原始 AMQP 消息。
     * @param message1 消费失败的 Spring Messaging 消息。
     * @param e        消息消费失败时抛出的异常。
     * @return 返回值可以是以下几种类型：
     * - 如果返回值为 null，则表示不重新处理消息。
     * - 如果返回值为一个对象，则表示将该对象作为处理结果返回。
     * - 如果返回值为一个 MessagingException，则表示将该异常向上抛出。
     * @throws Exception 如果需要将异常向上抛出，可以在这里抛出异常。
     */
    @Override
    public Object handleError(Message message, org.springframework.messaging.Message<?> message1, ListenerExecutionFailedException e) throws Exception {
        System.err.println("[异常处理器]处理消息时出错: " + e.getCause());
        // 重新抛出异常以触发重试机制
        throw e;
    }
}
